Passed
Push — master ( 681561...692569 )
by EMP
01:14
created

main.js ➔ shieldMix   A

Complexity

Conditions 4

Size

Total Lines 21
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 16
dl 0
loc 21
rs 9.6
c 0
b 0
f 0
cc 4
1
"use strict";
2
3
sodium.ready.then(function() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		console.log("Failed to load All-Ears");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
10
	}
11
});
12
13
let page=0;
14
15
function navMenu(num) {
16
	document.getElementById("div_readmsg").hidden = true;
17
18
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
19
	const d = document.getElementsByClassName("maindiv");
20
21
	for (let i = 0; i < 5; i++) {
22
		if (i === num) {
23
			b[i].disabled = true;
24
			d[i].hidden = false;
25
		} else {
26
			b[i].disabled = false;
27
			d[i].hidden = true;
28
		}
29
	}
30
}
31
32
function getCountryFlag(countryCode) {
33
	return sodium.to_string(new Uint8Array([
34
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
35
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
36
	]));
37
}
38
39
function deleteButtonShow(show) {
40
	if (show) {
41
		document.getElementById("btn_msgdel").hidden = false;
42
		return;
43
	}
44
45
	const checkboxes = document.getElementById("tbd_inbox").getElementsByTagName("input");
46
	let checked = false;
47
48
	for (let j = 0; j < checkboxes.length; j++) {
49
		if (checkboxes[j].checked) {
50
			checked = true;
51
			break;
52
		}
53
	}
54
55
	document.getElementById("btn_msgdel").hidden = !checked;
56
}
57
58
function addIntMessage(i) {
59
	const tbl = document.getElementById("tbd_inbox");
60
	const row = tbl.insertRow(-1);
61
62
	const ts = ae.GetIntMsgTime(i);
63
	let cell = row.insertCell(-1);
64
	cell.setAttribute("data-ts", ts);
65
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
66
	cell.className = "mono";
67
68
	cell = row.insertCell(-1);
69
	cell.textContent = ae.GetIntMsgTitle(i);
70
	cell.onclick = function() {
71
		navMenu(-1);
72
		document.getElementById("div_readmsg").hidden = false;
73
		document.getElementById("readmsg_head").hidden = false;
74
		document.getElementById("readmsg_levelinfo").hidden = false;
75
		document.getElementById("readmsg_extmsg").hidden = true;
76
77
		document.getElementById("readmsg_title").textContent = ae.GetIntMsgTitle(i);
78
		document.getElementById("readmsg_from").textContent  = ae.GetIntMsgFrom(i);
79
		document.getElementById("readmsg_to").textContent    = ae.GetIntMsgTo(i);
80
		document.getElementById("readmsg_body").textContent  = ae.GetIntMsgBody(i);
81
		document.getElementById("readmsg_level").textContent = ae.GetIntMsgLevel(i);
82
83
		document.getElementById("readmsg_from").className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
84
		document.getElementById("readmsg_to").className = (ae.GetIntMsgTo(i).length === 16) ? "mono" : "";
85
	};
86
87
	// empty From1 cell
88
	row.insertCell(-1);
89
90
	cell = row.insertCell(-1);
91
	cell.textContent = ae.GetIntMsgFrom(i);
92
	cell.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
93
94
	cell = row.insertCell(-1);
95
	cell.textContent = ae.GetIntMsgTo(i);
96
	cell.className = (ae.GetIntMsgTo(i).length === 16) ? "mono" : "";
97
98
	cell = row.insertCell(-1);
99
	cell.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetIntMsgIdHex(i) + "\">";
100
	cell.children[0].onchange = function() {deleteButtonShow(this.checked);};
101
}
102
103
function addExtMessage(i) {
104
	const tbl = document.getElementById("tbd_inbox");
105
	const row = tbl.insertRow(-1);
106
107
	const ts = ae.GetExtMsgTime(i);
108
	let cell = row.insertCell(-1);
109
	cell.setAttribute("data-ts", ts);
110
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
111
	cell.className = "mono";
112
113
	cell = row.insertCell(-1);
114
	cell.textContent = ae.GetExtMsgTitle(i);
115
	cell.onclick = function() {
116
		navMenu(-1);
117
		document.getElementById("div_readmsg").hidden = false;
118
		document.getElementById("readmsg_head").hidden = false;
119
		document.getElementById("readmsg_levelinfo").hidden = true;
120
		document.getElementById("readmsg_extmsg").hidden = false;
121
		document.getElementById("readmsg_greet").textContent = ae.GetExtMsgGreet(i);
122
		document.getElementById("readmsg_tls").textContent = ae.GetExtMsgTLS(i);
123
		document.getElementById("readmsg_ip").textContent = ae.GetExtMsgIp(i);
124
125
		document.getElementById("readmsg_country").textContent = ae.GetExtMsgCname(i) + " " + getCountryFlag(ae.GetExtMsgCcode(i));
126
127
		let flagText = "";
128
		if (!ae.GetExtMsgFlagPExt(i)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
129
		if (!ae.GetExtMsgFlagQuit(i)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
130
		if (ae.GetExtMsgFlagRare(i)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
131
		if (ae.GetExtMsgFlagFail(i)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
132
		if (ae.GetExtMsgFlagPErr(i)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
133
		document.getElementById("readmsg_flags").innerHTML = flagText.trim();
134
135
		document.getElementById("readmsg_title").textContent = ae.GetExtMsgTitle(i);
136
		document.getElementById("readmsg_from").textContent = ae.GetExtMsgEnvFrom(i);
137
		document.getElementById("readmsg_to").textContent = ae.GetExtMsgEnvTo(i);
138
		document.getElementById("readmsg_body").innerHTML = ae.GetExtMsgBody(i);
139
		document.getElementById("readmsg_headers").textContent = ae.GetExtMsgHeaders(i);
140
141
		document.getElementById("readmsg_from").className = "";
142
		document.getElementById("readmsg_to").className = (ae.GetExtMsgEnvTo(i).length === 16) ? "mono" : "";
143
	};
144
145
	const from = ae.GetExtMsgHdrFrom(i);
146
	const from2 = from.substring(from.indexOf("@") + 1);
147
148
	cell = row.insertCell(-1);
149
	cell.textContent = from.substring(0, from.indexOf("@"));
150
151
	const flag = document.createElement("abbr");
152
	flag.textContent = getCountryFlag(ae.GetExtMsgCcode(i));
153
	flag.title = ae.GetExtMsgCname(i);
154
155
	const fromText = document.createElement("span");
156
	fromText.textContent = " " + from2;
157
158
	cell = row.insertCell(-1);
159
	cell.appendChild(flag);
160
	cell.appendChild(fromText);
161
162
	cell = row.insertCell(-1);
163
	cell.textContent = ae.GetExtMsgEnvTo(i);
164
	cell.className = (ae.GetExtMsgEnvTo(i).length === 16) ? "mono" : "";
165
166
	cell = row.insertCell(-1);
167
	cell.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetExtMsgIdHex(i) + "\">";
168
	cell.children[0].onchange = function() {deleteButtonShow(this.checked);};
169
}
170
171
function addMessages() {
172
	const maxExt = ae.GetExtMsgCount();
173
	const maxInt = ae.GetIntMsgCount();
174
175
	let numExt = 0;
176
	let numInt = 0;
177
178
	//TODO handle sent messages separately
179
180
	for (let i = 0; i < (page * 20) + 20; i++) {
181
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
182
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
183
		if (tsInt === 0 && tsExt === 0) break;
184
185
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
186
			if (i < (page * 20)) {
187
				numInt++;
188
				continue;
189
			}
190
191
			addIntMessage(numInt);
192
			numInt++;
193
		} else if (tsExt !== 0) {
194
			if (i < (page * 20)) {
195
				numExt++;
196
				continue;
197
			}
198
199
			addExtMessage(numExt);
200
			numExt++;
201
		}
202
	}
203
}
204
205
function addFile(num) {
206
	const table = document.getElementById("tbody_files");
207
	const row = table.insertRow(-1);
208
209
	let cell = row.insertCell(-1);
210
	cell.textContent = new Date(ae.GetUplMsgTime(num) * 1000).toISOString().slice(0, 10);
211
212
	cell = row.insertCell(-1);
213
	cell.textContent = ae.GetUplMsgBytes(num) / 1024;
214
215
	cell = row.insertCell(-1);
216
	cell.textContent = ae.GetUplMsgTitle(num);
217
218
	cell = row.insertCell(-1);
219
	cell.innerHTML = "<button type=\"button\">D</button>";
220
	cell.children[0].onclick = function() {
221
		const a = document.createElement("a");
222
		a.href = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer]));
223
		a.download = ae.GetUplMsgTitle(num);
224
		a.click();
225
226
		URL.revokeObjectURL(a.href);
227
		a.href = "";
228
		a.download = "";
229
	};
230
231
	cell = row.insertCell(-1);
232
	cell.innerHTML = "<button type=\"button\">X</button>";
233
	cell.children[0].onclick = function() {
234
		ae.Message_Delete([ae.GetUplMsgIdHex(num)], function(error) {
235
			if (error === 0) {
236
				row.remove();
237
			} else {
238
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
239
			}
240
		});
241
	};
242
}
243
244
function destroyAccount(upk_hex) {
245
	const tbl = document.getElementById("tbody_admin");
246
247
	let rowid = -1;
248
249
	for (let i = 0; i < tbl.rows.length; i++) {
250
		if (upk_hex === tbl.rows[i].cells[0].textContent) {
251
			rowid = i;
252
			break;
253
		}
254
	}
255
256
	if (rowid === -1) return;
257
258
	ae.Account_Delete(upk_hex, function(error) {
259
		if (error === 0) {
260
			tbl.deleteRow(rowid);
261
		} else {
262
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
263
		}
264
	});
265
}
266
267
function setAccountLevel(upk_hex, level) {
268
	const tbl = document.getElementById("tbody_admin");
269
270
	let rowid = -1;
271
272
	for (let i = 0; i < tbl.rows.length; i++) {
273
		if (tbl.rows[i].cells[0].textContent === upk_hex) {
274
			rowid = i;
275
			break;
276
		}
277
	}
278
279
	if (rowid === -1) return;
280
281
	ae.Account_Update(upk_hex, level, function(error) {
282
		if (error !== 0) {
283
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
284
			return;
285
		}
286
287
		tbl.rows[rowid].cells[4].textContent = level;
288
289
		if (level === 0) {
290
			tbl.rows[rowid].cells[5].children[0].disabled = false;
291
			tbl.rows[rowid].cells[6].children[0].disabled = true;
292
		} else if (level === ae.GetLevelMax()) {
293
			tbl.rows[rowid].cells[5].children[0].disabled = true;
294
			tbl.rows[rowid].cells[6].children[0].disabled = false;
295
		} else {
296
			tbl.rows[rowid].cells[5].children[0].disabled = false;
297
			tbl.rows[rowid].cells[6].children[0].disabled = false;
298
		}
299
300
		const pkHex = ae.Admin_GetUserPkHex(rowid);
301
		const currentLevel = ae.Admin_GetUserLevel(rowid);
302
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
303
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
304
	});
305
}
306
307
function deleteAddress(addr) {
308
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
309
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
310
311
	let addressToDelete = -1;
312
313
	for (let i = 0; i < ae.GetAddressCount(); i++) {
314
		if (addr === ae.GetAddress(i)) {
315
			addressToDelete = i;
316
			break;
317
		}
318
	}
319
320
	if (addressToDelete === -1) return;
321
322
	ae.Address_Delete(addressToDelete, function(error) {
323
		if (error !== 0) {
324
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
325
			return;
326
		}
327
328
		document.getElementById("tbody_opt_addr").deleteRow(addressToDelete);
329
		document.getElementById("send_from").remove(addressToDelete);
330
331
		document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
332
		document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
333
334
		if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_newaddress").disabled = false;
335
		if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
336
337
		ae.Private_Update(function(error2) {
338
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
339
340
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
341
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
342
		});
343
	});
344
}
345
346
function addAddress(num) {
347
	const addrTable = document.getElementById("tbody_opt_addr");
348
	const row = addrTable.insertRow(-1);
349
350
	let cell = row.insertCell(-1);
351
	cell.textContent = ae.GetAddress(num);
352
	if (cell.textContent.length === 16) cell.className = "mono";
353
	cell.onclick = function() {
354
		if (cell.textContent.length === 16)
355
			navigator.clipboard.writeText(ae.ShieldMix(cell.textContent) + "@" + ae.GetDomainEml());
356
		else
357
			navigator.clipboard.writeText(cell.textContent + "@" + ae.GetDomainEml());
358
	};
359
360
	cell = row.insertCell(-1);
361
	cell.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
362
363
	cell = row.insertCell(-1);
364
	cell.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
365
366
	cell = row.insertCell(-1);
367
	cell.innerHTML = "<button type=\"button\">X</button>";
368
	cell.children[0].onclick = function() {deleteAddress(ae.GetAddress(num));};
369
370
	const opt = document.createElement("option");
371
	opt.value = ae.GetAddress(num);
372
	opt.textContent = ae.GetAddress(num) + "@" + ae.GetDomainEml();
373
	document.getElementById("send_from").appendChild(opt);
374
}
375
376
function clearMessages() {
377
	document.getElementById("tbd_inbox").innerHTML = "";
378
	document.getElementById("tbd_snbox").innerHTML = "";
379
	document.getElementById("tbody_files").innerHTML = "";
380
}
381
382
function delMsgs(tblName, btnName) {
383
	const cbs = document.getElementsByClassName("delMsg");
384
	const ids = [];
385
386
	for (let i = 0; i < cbs.length; i++) {
387
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
388
	}
389
390
	if (ids.length > 0) ae.Message_Delete(ids, function(error) {
391
		if (error === 0) {
392
			clearMessages();
393
			addMessages();
394
			document.getElementById(btnName).hidden = true;
395
		} else {
396
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
397
		}
398
	});
399
}
400
401
function deleteContact(email) {
402
	const tbl = document.getElementById("tbody_notes_contact");
403
	const rows = tbl.rows;
404
405
	for (let i = 0; i < rows.length; i++) {
406
		if (email === rows[i].cells[0].textContent) {
407
			ae.DeleteContact(i);
408
			tbl.deleteRow(i);
409
			break;
410
		}
411
	}
412
413
	document.getElementById("btn_savenotes").hidden = false;
414
}
415
416
function addContactToTable(mail, name, note) {
417
	const contactTable = document.getElementById("tbody_notes_contact");
418
	const row = contactTable.insertRow(-1);
419
	const cellMail = row.insertCell(-1);
420
	const cellName = row.insertCell(-1);
421
	const cellNote = row.insertCell(-1);
422
	const cellBtnD = row.insertCell(-1);
423
424
	cellMail.className = "left";
425
	cellName.className = "left";
426
	cellNote.className = "left";
427
428
	cellMail.textContent = mail;
429
	cellName.textContent = name;
430
	cellNote.textContent = note;
431
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
432
433
	cellBtnD.onclick = function() {deleteContact(mail);};
434
}
435
436
function addRowAdmin(num) {
437
	const table = document.getElementById("tbody_admin");
438
439
	const row = table.insertRow(-1);
440
	const cellPk = row.insertCell(-1);
441
	const cellMb = row.insertCell(-1);
442
	const cellNa = row.insertCell(-1);
443
	const cellSa = row.insertCell(-1);
444
	const cellLv = row.insertCell(-1);
445
	const cellBtnPl = row.insertCell(-1);
446
	const cellBtnMn = row.insertCell(-1);
447
	const cellBtnDe = row.insertCell(-1);
448
449
	cellPk.textContent = ae.Admin_GetUserPkHex(num);
450
	cellMb.textContent = ae.Admin_GetUserSpace(num);
451
	cellNa.textContent = ae.Admin_GetUserNAddr(num);
452
	cellSa.textContent = ae.Admin_GetUserSAddr(num);
453
	cellLv.textContent = ae.Admin_GetUserLevel(num);
454
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
455
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
456
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
457
458
	cellPk.className = "mono";
459
	if (ae.Admin_GetUserLevel(num) === ae.GetLevelMax()) cellBtnPl.children[0].disabled = true;
460
	if (ae.Admin_GetUserLevel(num) === 0) cellBtnMn.children[0].disabled = true;
461
462
	const pkHex = ae.Admin_GetUserPkHex(num);
463
	const currentLevel = ae.Admin_GetUserLevel(num);
464
	cellBtnPl.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
465
	cellBtnMn.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
466
	cellBtnDe.children[0].onclick = function() {destroyAccount(pkHex);};
467
}
468
469
function reloadInterface() {
470
	if (!ae.IsUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
471
	document.getElementById("div_begin").hidden = true;
472
	document.getElementById("div_allears").hidden = false;
473
474
	clearMessages();
475
	document.getElementById("tbody_admin").innerHTML = "";
476
	document.getElementById("tbody_files").innerHTML = "";
477
	document.getElementById("tbody_notes_contact").innerHTML = "";
478
	document.getElementById("tbody_opt_addr").innerHTML = "";
479
480
	// Contacts
481
	for (let i = 0; i < ae.GetContactCount(); i++) {
482
		addContactToTable(
483
			ae.GetContactMail(i),
484
			ae.GetContactName(i),
485
			ae.GetContactNote(i)
486
		);
487
	}
488
489
	// Addresses
490
	for (let i = 0; i < ae.GetAddressCount(); i++) {
491
		addAddress(i);
492
	}
493
494
	document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
495
	document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
496
	document.getElementById("addr_max_normal").textContent = ae.GetLimitNormalA(ae.GetUserLevel());
497
	document.getElementById("addr_max_shield").textContent = ae.GetLimitShieldA(ae.GetUserLevel());
498
499
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_newaddress").disabled = true;
500
	if (ae.GetAddressCountShield() >= ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
501
502
	if (ae.IsUserAdmin()) {
503
		const tblLimits = document.getElementById("tbl_limits");
504
		for (let i = 0; i < 4; i++) {
505
			tblLimits.rows[i].cells[1].children[0].value = ae.GetStorageLimit(i);
506
			tblLimits.rows[i].cells[2].children[0].value = ae.GetLimitNormalA(i);
507
			tblLimits.rows[i].cells[3].children[0].value = ae.GetLimitShieldA(i);
508
		}
509
510
		document.getElementById("btn_admin_savelimits").onclick = function() {
511
			const storageLimit = [];
512
			const addrNrmLimit = [];
513
			const addrShdLimit = [];
514
515
			for (let i = 0; i < 4; i++) {
516
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
517
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
518
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
519
			}
520
521
			ae.SetLimits(storageLimit, addrNrmLimit, addrShdLimit, function(error) {
522
				if (error !== 0) {
523
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
524
				}
525
			});
526
		};
527
528
		for (let i = 0; i < ae.Admin_GetUserCount(); i++) {
529
			addRowAdmin(i);
530
		}
531
	}
532
}
533
534
document.getElementById("btn_inbox_prev").onclick = function() {
535
	if (page > 0) {
536
		page--;
537
		clearMessages();
538
		addMessages();
539
		this.disabled = (page === 0);
540
	}
541
};
542
543
document.getElementById("btn_inbox_next").onclick = function() {
544
// TODO: Check if page too high
545
//	if (page > 0) {
546
		page++;
547
		clearMessages();
548
		addMessages();
549
		document.getElementById("btn_inbox_prev").disabled = false;
550
//	}
551
};
552
553
document.getElementById("btn_enter").onclick = function() {
554
	const txtSkey = document.getElementById("txt_skey");
555
	if (!txtSkey.reportValidity()) return;
556
557
	const btn = this;
558
	btn.disabled = true;
559
560
	ae.SetKeys(txtSkey.value, function(success) {
561
		if (!success) {
562
			console.log("Invalid format for key");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
563
			btn.disabled = false;
564
			return;
565
		}
566
567
		ae.Message_Browse(false, true, function(statusBrowse) {
568
			if (statusBrowse !== 0) {
569
				console.log("Failed to enter");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
570
				btn.disabled = false;
571
				return;
572
			}
573
574
			txtSkey.value = "";
575
			reloadInterface();
576
			document.getElementById("btn_refresh").click();
577
		});
578
	});
579
};
580
581
document.getElementById("btn_refresh").onclick = function() {
582
	const btn = this;
583
	btn.disabled = true;
584
585
	ae.Message_Browse(true, false, function(error) {
586
		if (error === 0) {
587
			clearMessages();
588
			addMessages();
589
			for (let i = ae.GetUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
590
		} else {
591
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
592
		}
593
594
		btn.disabled = false;
595
	});
596
};
597
598
document.getElementById("btn_contact_add").onclick = function() {
599
	const txtMail = document.getElementById("txt_newcontact_mail");
600
	const txtName = document.getElementById("txt_newcontact_name");
601
	const txtNote = document.getElementById("txt_newcontact_note");
602
603
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
604
	ae.AddContact(txtMail.value, txtName.value, txtNote.value);
605
606
	txtMail.value = "";
607
	txtName.value = "";
608
	txtNote.value = "";
609
610
	document.getElementById("btn_savenotes").hidden = false;
611
};
612
613
document.getElementById("btn_savenotes").onclick = function() {
614
	ae.Private_Update(function(error) {
615
		if (error === 0) {
616
			document.getElementById("btn_savenotes").hidden = true;
617
		} else {
618
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
619
		}
620
	});
621
};
622
623
document.getElementById("btn_msgdel").onclick = function() {
624
	delMsgs("tbody_inbox", "btn_msgdel");
625
};
626
627
document.getElementById("btn_sentdel").onclick = function() {
628
	delMsgs("tbody_sentbox", "btn_sentdel");
629
};
630
631
document.getElementById("btn_send").onclick = function() {
632
	const btn = this;
633
	btn.disabled = true;
634
635
	const sfrom = document.getElementById("send_from");
636
	const stitle = document.getElementById("send_title");
637
	const sto = document.getElementById("send_to");
638
	const sbody = document.getElementById("send_body");
639
640
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
641
642
	ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, null, function(error) {
643
		if (error === 0) {
644
			stitle.value = "";
645
			sto.value = "";
646
			sbody.value = "";
647
		} else {
648
			console.log("Failed sending message");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
649
		}
650
651
		btn.disabled = false;
652
	});
653
};
654
655
document.getElementById("btn_newaddress").onclick = function() {
656
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) return;
657
658
	const txtNewAddr = document.getElementById("txt_newaddress");
659
	if (!txtNewAddr.reportValidity()) return;
660
661
	const btnN = document.getElementById("btn_newaddress");
662
	const btnS = document.getElementById("btn_newshieldaddress");
663
	btnN.disabled = true;
664
	btnS.disabled = true;
665
666
	ae.Address_Create(txtNewAddr.value, function(error1) {
667
		if (error1 === 0) {
668
			ae.Private_Update(function(error2) {
669
				document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
670
				addAddress(ae.GetAddressCount() - 1);
671
				txtNewAddr.value = "";
672
673
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
674
				if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
675
				if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
676
			});
677
		} else {
678
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
679
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
680
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
681
		}
682
	});
683
};
684
685
document.getElementById("btn_newshieldaddress").onclick = function() {
686
	if (ae.GetLimitShieldA() >= ae.GetLimitShieldA(ae.GetUserLevel())) return;
687
688
	const btnN = document.getElementById("btn_newaddress");
689
	const btnS = document.getElementById("btn_newshieldaddress");
690
	btnN.disabled = true;
691
	btnS.disabled = true;
692
693
	ae.Address_Create("SHIELD", function(error1) {
694
		if (error1 !== 0) {
695
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
696
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
697
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
698
			return;
699
		}
700
701
		ae.Private_Update(function(error2) {
702
			document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
703
			addAddress(ae.GetAddressCount() - 1);
704
705
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
706
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
707
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
708
		});
709
	});
710
};
711
712
document.getElementById("btn_saveaddrdata").onclick = function() {
713
	const tbl = document.getElementById("tbody_opt_addr");
714
715
	for (let i = 0; i < tbl.rows.length; i++) {
716
		ae.SetAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
717
		ae.SetAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
718
	}
719
720
	ae.Address_Update(function(error) {
721
		if (error === 0) {
722
			document.getElementById("btn_saveaddrdata").hidden = true;
723
		} else {
724
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
725
		}
726
	});
727
};
728
729
document.getElementById("btn_admin_addaccount").onclick = function() {
730
	const txtPkey = document.getElementById("txt_newacc_pkey");
731
732
	if (!txtPkey.reportValidity()) return;
733
734
	const btn = document.getElementById("btn_admin_addaccount");
735
	btn.disabled = true;
736
737
	ae.Account_Create(txtPkey.value, function(error) {
738
		if (error === 0) {
739
			addRowAdmin(ae.Admin_GetUserCount() - 1);
740
			txtPkey.value = "";
741
		} else {
742
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
743
		}
744
	});
745
746
	btn.disabled = false;
747
};
748
749
document.getElementById("btn_uploadfile").onclick = function() {
750
	const fileSelector = document.getElementById("upfile");
751
	const f = fileSelector.files[0];
752
753
	if (f.name.length + f.size > 8138) {
754
		console.log("Too large");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
755
		fileSelector.value = null;
756
		return;
757
	}
758
759
	const btn = this;
760
	btn.disabled = true;
761
762
	const reader = new FileReader();
763
	reader.onload = function(e) {
0 ignored issues
show
Unused Code introduced by
The parameter e is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
764
		const u8data = new Uint8Array(reader.result);
765
766
		ae.Message_Upload(true, f.name, u8data, function(error) {
767
			if (error === 0) {
768
				addFile(ae.GetFileCount() - 1);
769
				fileSelector.value = null;
770
			} else {
771
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
772
			}
773
774
			btn.disabled = false;
775
		});
776
	};
777
778
	reader.readAsArrayBuffer(f);
779
};
780
781
function navNotesMenu(num) {
782
	for (let i = 0; i < 3; i++) {
783
		if (i === num) {
784
			document.getElementById("div_notes").children[0].children[i].disabled = true;
785
			document.getElementById("div_notes").children[1 + i].hidden = false;
786
		} else {
787
			document.getElementById("div_notes").children[0].children[i].disabled = false;
788
			document.getElementById("div_notes").children[1 + i].hidden = true;
789
		}
790
	}
791
}
792
793
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
794
btns[0].onclick = function() {navMenu(0);};
795
btns[1].onclick = function() {navMenu(1);};
796
btns[2].onclick = function() {navMenu(2);};
797
btns[3].onclick = function() {navMenu(3);};
798
btns[4].onclick = function() {navMenu(4);};
799
800
btns = document.getElementById("div_notes").getElementsByTagName("button");
801
btns[0].onclick = function() {navNotesMenu(0);};
802
btns[1].onclick = function() {navNotesMenu(1);};
803
btns[2].onclick = function() {navNotesMenu(2);};
804
btns[3].onclick = function() {navNotesMenu(3);};
805
806
document.getElementById("txt_skey").onkeyup = function(e) {
807
	if (e.key === "Enter") document.getElementById("btn_enter").click();
808
};
809
810
navMenu(0);
811
812
});
813